/**
 * 数据格式化工具函数
 * 用于处理HTML标签去除、时间格式化等通用功能
 */

/**
 * 去除HTML标签的函数
 * @param {string} html - 包含HTML标签的字符串
 * @returns {string} 去除HTML标签后的纯文本
 */
function stripHtmlTags(html) {
  if (!html) return ''
  
  // 更强大的HTML标签去除，包括处理嵌套标签和特殊字符
  return html
    .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '') // 移除script标签
    .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '') // 移除style标签
    .replace(/<[^>]*>/g, '') // 移除所有HTML标签
    .replace(/&nbsp;/g, ' ') // 替换HTML实体
    .replace(/&lt;/g, '<')
    .replace(/&gt;/g, '>')
    .replace(/&amp;/g, '&')
    .replace(/&quot;/g, '"')
    .replace(/&#39;/g, "'")
    .replace(/\s+/g, ' ') // 合并多个空格
    .trim()
}

/**
 * 截取文本到指定长度并添加省略号
 * @param {string} text - 原始文本
 * @param {number} maxLength - 最大长度，默认100
 * @returns {string} 截取后的文本
 */
function truncateText(text, maxLength = 100) {
  if (!text) return ''
  if (text.length <= maxLength) return text
  return text.substring(0, maxLength) + '...'
}

/**
 * 格式化时间显示
 * @param {string} dateTimeString - ISO时间字符串
 * @returns {string} 格式化后的时间字符串
 */
function formatDateTime(dateTimeString) {
  if (!dateTimeString) return ''
  
  try {
    const date = new Date(dateTimeString)
    if (isNaN(date.getTime())) return dateTimeString // 如果解析失败，返回原字符串
    
    const year = date.getFullYear()
    const month = String(date.getMonth() + 1).padStart(2, '0')
    const day = String(date.getDate()).padStart(2, '0')
    const hours = String(date.getHours()).padStart(2, '0')
    const minutes = String(date.getMinutes()).padStart(2, '0')
    
    return `${year}-${month}-${day} ${hours}:${minutes}`
  } catch (error) {
    console.error('时间格式化错误:', error)
    return dateTimeString
  }
}

/**
 * 格式化活动时间显示（更友好的格式）
 * @param {string} dateTimeString - 日期时间字符串
 * @returns {string} 格式化后的时间字符串
 */
function formatActivityTime(dateTimeString) {
  if (!dateTimeString) return ''
  
  try {
    // 处理各种可能的日期时间格式
    let dateStr = dateTimeString
    
    // 如果是ISO格式，提取日期和时间部分
    if (dateStr.includes('T')) {
      const [datePart, timePart] = dateStr.split('T')
      const cleanTimePart = timePart.split('.')[0] // 移除毫秒部分
      dateStr = `${datePart} ${cleanTimePart}`
    }
    
    // 解析日期时间
    const date = new Date(dateStr)
    if (isNaN(date.getTime())) return dateTimeString
    
    const year = date.getFullYear()
    const month = String(date.getMonth() + 1).padStart(2, '0')
    const day = String(date.getDate()).padStart(2, '0')
    const hours = String(date.getHours()).padStart(2, '0')
    const minutes = String(date.getMinutes()).padStart(2, '0')
    
    // 返回更友好的格式：YYYY年MM月DD日 HH:MM
    return `${year}年${month}月${day}日 ${hours}:${minutes}`
  } catch (error) {
    console.error('活动时间格式化错误:', error)
    return dateTimeString
  }
}

/**
 * 处理活动数据，去除HTML标签并格式化
 * @param {Object} activity - 原始活动数据
 * @param {Object} options - 配置选项
 * @returns {Object} 处理后的活动数据
 */
function processActivityData(activity, options = {}) {
  const {
    stripHtml = true,
    truncateDescription = true,
    descriptionLength = 60,
    formatTime = true
  } = options

  let description = activity.content || activity.description || ''
  
  // 去除HTML标签
  if (stripHtml) {
    description = stripHtmlTags(description)
  }
  
  // 截取描述文本
  if (truncateDescription) {
    description = truncateText(description, descriptionLength)
  }
  
  // 格式化时间显示（组合日期和时间）
  let startTime = ''
  let endTime = ''
  
  if (formatTime) {
    // 组合开始日期和时间
    if (activity.start_date && activity.start_time) {
      // 处理时间格式，确保时间格式正确
      let startDate = activity.start_date
      let startTimeStr = activity.start_time
      
      // 如果时间包含T和Z，说明是ISO格式，需要提取时间部分
      if (startTimeStr.includes('T')) {
        startTimeStr = startTimeStr.split('T')[1].split('.')[0] // 提取HH:MM:SS部分
      }
      
      // 如果日期包含T，说明是ISO格式，需要提取日期部分
      if (startDate.includes('T')) {
        startDate = startDate.split('T')[0] // 提取YYYY-MM-DD部分
      }
      
      startTime = formatActivityTime(`${startDate} ${startTimeStr}`)
    }
    
    // 组合结束日期和时间
    if (activity.end_date && activity.end_time) {
      // 处理时间格式，确保时间格式正确
      let endDate = activity.end_date
      let endTimeStr = activity.end_time
      
      // 如果时间包含T和Z，说明是ISO格式，需要提取时间部分
      if (endTimeStr.includes('T')) {
        endTimeStr = endTimeStr.split('T')[1].split('.')[0] // 提取HH:MM:SS部分
      }
      
      // 如果日期包含T，说明是ISO格式，需要提取日期部分
      if (endDate.includes('T')) {
        endDate = endDate.split('T')[0] // 提取YYYY-MM-DD部分
      }
      
      endTime = formatActivityTime(`${endDate} ${endTimeStr}`)
    }
  } else {
    startTime = activity.start_time || ''
    endTime = activity.end_time || ''
  }
  
  return {
    ...activity,
    description: description,
    startTime: startTime,
    endTime: endTime,
    // 保持原始内容用于编辑
    originalContent: activity.content || activity.description || '',
    // 保持原始时间字段用于编辑
    originalStartDate: activity.start_date,
    originalStartTime: activity.start_time,
    originalEndDate: activity.end_date,
    originalEndTime: activity.end_time,
    originalRegistrationDeadline: activity.registration_deadline
  }
}

module.exports = {
  stripHtmlTags,
  truncateText,
  formatDateTime,
  formatActivityTime,
  processActivityData
}
